package FooBarBibliotheque;

import java.io.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.GregorianCalendar;
import java.util.HashSet;

public class MenuBiblio {

    // ************************************************************************************************************
    // Constantes
    // ************************************************************************************************************
    private static final long serialVersionUID = 1L;
    // ************************************************************************************************************
    // Attributs
    // ************************************************************************************************************
    private static Bibliotheque bibliotheque;

    public MenuBiblio(Bibliotheque b) {
        bibliotheque = b;
    }

    /**
     * Gestion du menu principal.
     */
    public static void menuPrincipal() {
        int choix;
        GregorianCalendar datejour = new GregorianCalendar();

        do {
            EntreSortie.afficherMessage("");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      " + EntreSortie.ecrireDate(datejour));
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      *           GESTION BIBLIOTHEQUE         *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      * 1- Operations sur les LECTEURS         *");
            EntreSortie.afficherMessage("      * 2- Operations sur les OUVRAGES         *");
            EntreSortie.afficherMessage("      * 3- Operations sur les PERIODIQUES      *");
            EntreSortie.afficherMessage("      * 4- Recherches                          *");
            EntreSortie.afficherMessage("      *                                        *");
            EntreSortie.afficherMessage("      * 0- Quitter                             *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("");
            choix = EntreSortie.lireEntier("      Votre Choix : ");
            switch (choix) {
                case 1: {
                    menuLecteur();
                    break;
                }
                case 2: {
                    menuOuvrage();
                    break;
                }
                case 3: {
                    menuPeriodiques();
                    break;
                }
                case 4: {
                    menuRecherche();
                    break;
                }
                default: {
                    break;
                }
            } // switch
        } while (choix != 0);
    } // Fin menuPrincipal

    /**
     * Menu sur le lecteur
     */
    public static void menuLecteur() {
        int choix;
        do {
            EntreSortie.afficherMessage("");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      *        Operations sur les LECTEURS     *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      * 1- Ajouter un lecteur                  *");
            EntreSortie.afficherMessage("      * 2- Consulter un lecteur                *");
            EntreSortie.afficherMessage("      * 3- Consulter emprunts d'un lecteur     *");
            EntreSortie.afficherMessage("      * 4- Relancer un lecteur                 *");
            EntreSortie.afficherMessage("      *                                        *");
            EntreSortie.afficherMessage("      * 0- Retour au menu principal            *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("");
            choix = EntreSortie.lireEntier("      Votre Choix : ");

            switch (choix) {
                case 1: {

                    bibliotheque.nouveauLecteur();
                    break;
                }
                case 2: {
                    bibliotheque.consulterLecteur();
                    break;
                }
                case 3: {
                    bibliotheque.consulterEmpruntLecteur();
                    break;
                }
                case 4: {
                    bibliotheque.relancerLecteur();
                    break;
                }
                default: {
                    break;
                }
            } // switch

        } while (choix != 0);
    } // Fin menuLecteur

    public static void menuOuvrage() {
        int choix;

        // Boucle tant que l'utilisateur ne fait pas le choix 0
        do {
            EntreSortie.afficherMessage("");
            EntreSortie.afficherMessage("      *********************************************");
            EntreSortie.afficherMessage("      *     Operations sur les OUVRAGES           *");
            EntreSortie.afficherMessage("      *********************************************");
            EntreSortie.afficherMessage("      * 1- Ajouter un ouvrage                     *");
            EntreSortie.afficherMessage("      * 2- Ajouter un exemplaire                  *");
            EntreSortie.afficherMessage("      * 3- Consulter un ouvrage                   *");
            EntreSortie.afficherMessage("      * 4- Consulter les exemplaires d'un ouvrage *");
            EntreSortie.afficherMessage("      * 5- Emprunter un exemplaire                *");
            EntreSortie.afficherMessage("      * 6- Rendre un exemplaire                   *");
            EntreSortie.afficherMessage("      *                                           *");
            EntreSortie.afficherMessage("      * 0- Retour au menu principal               *");
            EntreSortie.afficherMessage("      *********************************************");
            EntreSortie.afficherMessage("");
            choix = EntreSortie.lireEntier("      Votre Choix : ");

            switch (choix) {
                case 1: {
                    bibliotheque.nouvelOuvrage();
                    break;
                }
                case 2: {
                    bibliotheque.nouvelExemplaire();
                    break;
                }

                case 3: {
                    bibliotheque.consulterOuvrage();
                    break;
                }

                case 4: {
                    bibliotheque.consulterExemplairesOuvrage();
                    break;
                }

                case 5: {
                    bibliotheque.emprunterExemplaire();
                    break;
                }

                case 6: {
                    bibliotheque.rendreExemplaire();
                    break;
                }

                default: {
                    break;
                }
            } // switch

        } while (choix != 0);
    } // Fin menuOuvrage

    public static void menuPeriodiques() {
        int choix;
        do {
            EntreSortie.afficherMessage("");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      *        Operations sur les PERIODIQUES  *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      * 1- Ajouter un periodiques              *");
            EntreSortie.afficherMessage("      * 2- Ajouter une parution                *");
            EntreSortie.afficherMessage("      * 3- Consulter une parution              *");
            EntreSortie.afficherMessage("      * 4- Consulter une periodique            *");
            EntreSortie.afficherMessage("      *                                        *");
            EntreSortie.afficherMessage("      * 0- Retour au menu principal            *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("");
            choix = EntreSortie.lireEntier("      Votre Choix : ");

            switch (choix) {
                case 1: {

                    bibliotheque.enregistrePeriodique();
                    break;
                }
                case 2: {
                    bibliotheque.enrgistrerParution();
                    break;
                }
                case 3: {
                    bibliotheque.consulterParution();
                    break;
                }
                case 4: {
                    bibliotheque.consulterPeriodique();
                    break;
                }
                default: {
                    break;
                }
            } // switch

        } while (choix != 0);
    } // Fin menuPeriodiques

    private static void menuRecherche() {
        int choix;
        GregorianCalendar datejour = new GregorianCalendar();

        do {
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      *              MENU RECHERCHES           *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("      * 1- Recherche par nom d'auteur          *");
            EntreSortie.afficherMessage("      * 2- Recherche par mot clef titre        *");
            EntreSortie.afficherMessage("      * 3- Recherche par mot clef contenu      *");
            EntreSortie.afficherMessage("      *                                        *");
            EntreSortie.afficherMessage("      * 0- Quitter                             *");
            EntreSortie.afficherMessage("      ******************************************");
            EntreSortie.afficherMessage("");
            choix = EntreSortie.lireEntier("      Votre Choix : ");

            switch (choix) {
                case 1: {
                    bibliotheque.rechercheNomAuteur();
                    break;
                }
                case 2: {
                    bibliotheque.rechercheMotClefTitre();
                    break;
                }
                case 3: {
                    bibliotheque.rechercheMotClefContenu();
                    break;
                }
            }
        } while (choix != 0);
    }

    // *************************************
    public static void main(String[] arg) throws IOException{
        /*
        bibliotheque = new Bibliotheque();
        menuPrincipal();
         */
        Bibliotheque bibiotheque = new Bibliotheque();
        String nomfich = "FsauveTest.ser";

        // Restauration des objets de l'application
        try {
            FileInputStream fichier = new FileInputStream(nomfich);
            ObjectInputStream in = new ObjectInputStream(fichier);

            bibiotheque = (Bibliotheque) in.readObject();

            EntreSortie.afficherMessage(" $$$ Restauration du fichier " + nomfich + " realis�e");
        } catch (Exception e) {
            EntreSortie.afficherMessage(" *** Start : Pbs de Restauration / fichier " + nomfich);
            System.out.println(e);
        }

        //Creation de mots clefs interdits
        String chaine="";
	String fichier ="mots.txt";
        HashSet<String> mots = new HashSet<String>();
        BufferedReader br =null;
	try{
		InputStream f =new FileInputStream(fichier);
		InputStreamReader fr =new InputStreamReader(f);
		 br=new BufferedReader(fr);
		while (true)
			mots.add(br.readLine().trim());
	}
	catch (Exception e){
            br.close();
	}
        MotClefTitre.mots = mots;

        // Creation de l'instance menu de MenuBiblio
        MenuBiblio menu = new MenuBiblio(bibiotheque);

        // Appel au Menu Principal
        MenuBiblio.menuPrincipal();

        // Sauvegarde des objets de l'application en fin d'ex�cution du menu
        try {
            FileOutputStream f = new FileOutputStream(nomfich);
            ObjectOutputStream out = new ObjectOutputStream(f);

            out.writeObject(bibiotheque);

            EntreSortie.afficherMessage(" $$$ Sauvegarde dans le fichier " + nomfich + " realisee");
        } catch (Exception e) {
            EntreSortie.afficherMessage(" *** Start :Pbs de Sauvegarde dans le fichier " + nomfich);
            System.out.println(e);
        }
    }
} // Fin Classe MenuBiblio

